//
//  WRYBaseThemeViewController.m
//  BaiSiBuJie
//
//  Created by wry on 16/5/8.
//  Copyright © 2016年 WRY. All rights reserved.
//

#import "WRYBaseThemeViewController.h"
#import "WRYEssenceController.h"
#import "WRYThemeViewModal.h"
#import "WRYThemeCell.h"
#import "WRYThemeItem.h"

#import <AFNetworking.h>
#import <MJExtension/MJExtension.h>
#import <UIImageView+WebCache.h>
#import <MJRefresh/MJRefresh.h>

static NSString *const ID=@"cell";//重用标识

@interface WRYBaseThemeViewController ()
@property(nonatomic,weak) id observer;//监听重复点击tabbar按钮
@property(nonatomic,strong)NSMutableArray * themeViewModalList;//cell模型数组
@property(nonatomic,strong)AFHTTPSessionManager * mgr;//会话管理者

//第一次加载帖子时候不需要传入此关键字，当需要加载下一页时：需要传入加载上一页时返回值字段“maxtime”中的内容。
@property(nonatomic,strong)NSNumber * maxtime;//上拉刷新时使用的参数



@end
@implementation WRYBaseThemeViewController
// 以后只要界面有请求，就懒加载一个请求管理者
-(AFHTTPSessionManager *)mgr
{
    if (_mgr==nil) {
        _mgr=[AFHTTPSessionManager manager];
    }
    return _mgr;
}


#pragma mark - 判断是新帖还是精华
-(NSString *)list
{
    if ([self.parentViewController isKindOfClass:[WRYEssenceController class]]) {
        return @"list";
    }
    else {return @"newlist";}
}

#pragma mark - viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];


    //点击状态栏回到顶部功能
    [UIView animateWithDuration:0.3 animations:^{

        self.tableView.scrollsToTop=YES;
    }];

    //通过注册类的方式注册的cell,是代码创建的,调用initWithStyle:reuseIdentifier:
    [self.tableView registerClass:[WRYThemeCell class] forCellReuseIdentifier:ID];

    // 最后一个cell不显示，只要添加底部额外滚动区域就好
    self.tableView.contentInset=UIEdgeInsetsMake(108, 0, 49, 0);

    //添加下拉刷新控件
    [self setHeaderRefreshView];

    //添加上拉刷新控件
    [self setFooterRefreshView];

    //请求数据
    [self.tableView.mj_header beginRefreshing];//这个方法会触发加载数据,并且有下拉刷新的动画.

    // 取消tableView分割线
    self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;


    //添加通知观察者,监听重复点击tabbar按钮,刷新对应控制器数据
    _observer=[[NSNotificationCenter defaultCenter] addObserverForName:WRYRepeatClickTabBarBtnNote object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {

        //判断是哪个控制器需要刷新
        // 判断下当前哪个控制器的view显示出来,如果显示出来的view，都能拿到当前窗口
        if (self.tableView.window) {//能拿到当前窗口的view是显示出来的view,就刷新他,  tabbarVC只有一个view显示,
            [self reloadData];
        }
        
    }];

}
#pragma mark - dealloc
-(void)dealloc
{
    //移除通知
    [[NSNotificationCenter defaultCenter]removeObserver:_observer];
}

#pragma mark - 添加下拉刷新功能
//刷新数据
-(void)reloadData
{
    [self.tableView.mj_header beginRefreshing];//这个方法会触发加载数据,并且有下拉刷新的动画.
}
//添加控件
-(void)setHeaderRefreshView
{
    // 1.创建下拉刷新控件
    MJRefreshNormalHeader * headerRefreshView=[MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
    // 2.控制下拉刷新显示,最开始位置透明度0，完全透明
    headerRefreshView.automaticallyChangeAlpha=YES;
    self.tableView.mj_header=headerRefreshView;
    // 3.使用MJRefresh一定要记得在请求成功的时候，结束刷新
}
//加载最新数据
-(void)loadNewData
{
    // 1.取消刷新请求,避免连个刷新冲突
    [self.mgr.tasks makeObjectsPerformSelector:@selector(cancel)];
    // 2.参数
    NSMutableDictionary *parameter= [NSMutableDictionary dictionary];
    parameter[@"a"]=self.list;
    parameter[@"c"]=@"data";
    parameter[@"type"]=self.type;
    // 3.发送请求
    [_mgr  GET:WRYBassURL parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        // 请求完成,在请求成功的时候，结束刷新
        [self.tableView.mj_header endRefreshing];
        //页数
        _maxtime = responseObject[@"info"][@"maxtime"];

        //->模型数组-> 视图模型
        NSArray * dictArr=responseObject[@"list"];
        NSArray *themeList =[WRYThemeItem mj_objectArrayWithKeyValuesArray:dictArr];

        NSMutableArray *temp=[NSMutableArray array];

        for (WRYThemeItem *item in themeList) {
            // 创建视图模型
            WRYThemeViewModal *vm=[[WRYThemeViewModal alloc]init];
            vm.item=item;
            [temp addObject:vm];
        }
        _themeViewModalList=temp;//赋值

        [self.tableView reloadData];//刷新表格

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

#pragma mark - 添加上拉刷新功能
-(void)setFooterRefreshView
{
    //1.创建下拉刷新控件
    MJRefreshAutoNormalFooter * footerRefreshView=[MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{

        // 1.1取消下拉刷新请求,避免连个刷新冲突
        [self.mgr.tasks makeObjectsPerformSelector:@selector(cancel)];
        // 1.2.参数
        NSMutableDictionary *parameter= [NSMutableDictionary dictionary];
        parameter[@"a"]=self.list;
        parameter[@"c"]=@"data";
        parameter[@"type"]=self.type;
        parameter[@"maxtime"] = _maxtime;
        // 1.3.发送请求
        [_mgr  GET:WRYBassURL parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

            // 请求完成,在请求成功的时候，结束刷新
            [self.tableView.mj_footer endRefreshing];

            //字典数组->模型数组->视图模型
            NSArray * dictArr=responseObject[@"list"];

            NSArray *themeList =[WRYThemeItem mj_objectArrayWithKeyValuesArray:dictArr];
            //遍历模型数组,把模型存到视图模型的模型属性中,把每个视图模型存到视图模型数组中
            NSMutableArray *temp=[NSMutableArray array];
            for (WRYThemeItem*item in themeList) {
                WRYThemeViewModal*themeViewModal=[[WRYThemeViewModal alloc]init];
                themeViewModal.item=item;
                [temp addObject:themeViewModal];
            }

            // 拼接更多数据
            // addObjectsFromArray:就会把数组中所有元素全部添加上去
            [_themeViewModalList addObjectsFromArray:temp];

            [self.tableView reloadData];//刷新表格

            _maxtime = responseObject[@"info"][@"maxtime"];//页数

        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@",error);
        }];
    }];
    //2.自动隐藏上拉刷新控件，没有数据就会隐藏
    footerRefreshView.automaticallyHidden=YES;
    //告诉MJ创建了刷新控件
    self.tableView.mj_footer=footerRefreshView;
    //3.取消下拉刷新
    //4.请求成功时,结束刷新
}

#pragma mark - tableViewDatasource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _themeViewModalList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    WRYThemeCell *cell = [tableView dequeueReusableCellWithIdentifier:ID forIndexPath:indexPath];

    // 传递视图模型
    cell.vm=_themeViewModalList[indexPath.row] ;
    return cell;
}

//返回cell高度,在这里计算cell的高度已经晚了.
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 先计算好cell高度，再返回
    return ([_themeViewModalList[indexPath.row] cellH]);
}

@end
